package com.coderman.infosys.auth.domain.bo.authority;

import java.util.List;
import java.util.Set;

import com.coderman.infosys.auth.domain.enums.AuthorityTypeEnum;
import com.coderman.infosys.plat.auth.common.enums.StatusEnum;
import com.google.common.collect.Sets;
import lombok.Data;
import lombok.ToString;

/**
* @Description:权限聚合类
 *
 * 注意这里的权限聚合类是从角色维度和资源维度考虑的聚合，
 * 由于用户，角色，权限，资源这几个之间的关联关系在不同场景下会变得比较复杂
 * 体现到服务层面也很复杂，所以优先识别了权限聚合，权限与用户角色在场景上更多的是组合关系
 * 那么权限的组成就是资源了，所以这个切入点看上去会稳定一点
* @Author:shenshuai
* @CreateTime:2022-01-02 15:27:38
* @version v1.0
*/
@Data
@ToString
public class AuthorityBO {


   /** 主键ID **/
   private Long id;

   /** 权限编码标示 **/
   private String authCode;

   /** 权限类型 这个权限类型可能是个路由，但是是integer，对权限这个聚合根的建模有点偏差,参考authorityTypes **/
   @Deprecated
   private Integer authorityType;

   /** 权限类型 这个权限类型应该是有多个，查询的时候可以具体通过AuthorityTypeEnum来路由查询 **/
   /** 或者查询的时候底层通过联表查询，然后构建整个权限聚合根 **/
   private Set<String> authorityTypeSet;

   /** 关联角色 **/
   private String roleCode;

   /** 关联角色组 **/
   private String roleGroupCode;

   /** 数据字段权限列表 **/
   private List<DataAuthorityBO>  dataAuthorityBOList;

   /** 系统菜单权限列表 **/
   private List<SystemAuthorityBO>  systemAuthorityBOList;

   /** 行政权限列表 **/
   private List<AdminAuthorityBO>  adminAuthorityBOList;

   /** 权限状态 **/
   private Integer status;

   public void enable(){
      this.status = StatusEnum.ENABLE.getStatus();
   }

   public void disable(){
      this.status = StatusEnum.DISABLE.getStatus();
   }


   /**
    * 授权了数据字段权限
    * @return
    */
   public boolean withDataAuth(){
      return authorityTypeSet.contains(AuthorityTypeEnum.DATA.getCode().toString());
   }

   /**
    * 授权了系统菜单权限
    * @return
    */
   public boolean withSystemAuth(){
      return authorityTypeSet.contains(AuthorityTypeEnum.SYSTEM.getCode().toString());
   }

   /**
    * 授权了行政组织等权限
    * @return
    */
   public boolean withAdminSystemAuth(){
      return authorityTypeSet.contains(AuthorityTypeEnum.ADMINISTRATION.toString());
   }

   public void buildAuthTypeSet(String authorityTypeStr){
      this.authorityTypeSet = Sets.newHashSet(authorityTypeStr.split(","));
   }
}